package edu.pe.cayetano.model.bo;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;

public class ProgramacionAcademicaBO extends BaseBO{

	private	String		schema			= Configuration.getSchemaDB();

	/**
	 * Metodo que lista los niveles academicos
	 * */
	public BResult listarProgramacionAcademica() throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQuery(ConstantesSECCD.OPERACION_LISTADO,"","");
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarProgramacionAcademica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarProgramacionAcademica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo que lista los niveles academicos
	 * */
	public BResult listarProgramacionAcademicaMedico(String codMedico) throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQueryMedico(ConstantesSECCD.OPERACION_LISTADO,"","",codMedico);
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarProgramacionAcademicaMedico generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarProgramacionAcademicaMedico generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo que lista los niveles academicos
	 * */
	public BResult listarAlumnosxCurso(String codCurso) throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQueryAlumnosxCurso(ConstantesSECCD.OPERACION_LISTADO,"","",codCurso);
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarAlumnosxCurso generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[ProgramacionAcademicaBO] error en metodo listarAlumnosxCurso generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public StringBuffer estableceQuery(String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
				query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
				query.append(" ON B.COD_CURSO=A.COD_CURSO");
				query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
			}else{
				query.append(" SELECT B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
				query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
				query.append(" ON B.COD_CURSO=A.COD_CURSO");
				query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
				query.append(" AND UPPER("+campo.toUpperCase()+") LIKE '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
			query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
			query.append(" ON B.COD_CURSO=A.COD_CURSO");
			query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
			query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
			query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
		}
		System.out.println("[ProgramacionAcademicaBO][estableceQuery] query:"+query.toString());
		return query;
	}
	
	public StringBuffer estableceQueryMedico(String operacion,String campo,String criterio,String codMedico){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT  B.COD_CURSO AS COD_CURSO,B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
				query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
				query.append(" ON B.COD_CURSO=A.COD_CURSO");
				query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
				query.append(" INNER JOIN "+schema+"PROGRAMACION_ACADEMICA_MEDICO M ON M.PROGACAD_ID=A.PROGACAD_ID");
				query.append(" WHERE CODIGO_MEDDOC='"+codMedico+"'");
			}else{
				query.append(" SELECT B.COD_CURSO AS COD_CURSO,B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
				query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
				query.append(" ON B.COD_CURSO=A.COD_CURSO");
				query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
				query.append(" INNER JOIN "+schema+"PROGRAMACION_ACADEMICA_MEDICO M ON M.PROGACAD_ID=A.PROGACAD_ID");
				query.append(" WHERE CODIGO_MEDDOC=='"+codMedico+"'");
				query.append(" AND UPPER("+campo.toUpperCase()+") LIKE '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT B.COD_CURSO AS COD_CURSO,B.NOMBRE AS CURSO,C.NOMBRE AS CICLO,D.NOMBRE AS CURRICULA,E.NOMBRE AS PERIODO"); 
			query.append(" FROM "+schema+"PROGRAMACION_ACADEMICA A INNER JOIN "+schema+"CURSO B");
			query.append(" ON B.COD_CURSO=A.COD_CURSO");
			query.append(" INNER JOIN "+schema+"CICLO C ON C.CICLO_ID=A.CICLO_ID");
			query.append(" INNER JOIN "+schema+"CURRICULA D ON D.CURRICULA_ID=A.CURRICULA_ID");
			query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO E ON E.PERIODOACADEMICO_ID=A.PERIODOACADEMICO_ID");
			query.append(" INNER JOIN "+schema+"PROGRAMACION_ACADEMICA_MEDICO M ON M.PROGACAD_ID=A.PROGACAD_ID");
			query.append(" WHERE CODIGO_MEDDOC='"+codMedico+"'");
		}
		System.out.println("[ProgramacionAcademicaBO][estableceQueryMedico] query:"+query.toString());
		return query;
	}
	
	public StringBuffer estableceQueryAlumnosxCurso(String operacion,String campo,String criterio,String codCurso){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT D.NOMBRE AS PERIDO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, C.NOMBRE AS CURSO,");
				query.append(" A.CODIGO_ALUMNO,NOMBRE_COMPLETO FROM MATRICULA A INNER JOIN PROGRAMACION_ACADEMICA B ");
				query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID INNER JOIN CURSO C ON C.COD_CURSO=B.COD_CURSO ");
				query.append(" INNER JOIN PERIODO_ACADEMICO D ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID ");
				query.append(" INNER JOIN CURRICULA E ON E.CURRICULA_ID=B.CURRICULA_ID INNER JOIN ALUMNO F ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
				query.append(" WHERE D.ESTADO_ID=1 AND B.COD_CURSO='"+codCurso+"'");
			}else{
				query.append(" SELECT D.NOMBRE AS PERIDO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, C.NOMBRE AS CURSO,");
				query.append(" A.CODIGO_ALUMNO,NOMBRE_COMPLETO FROM MATRICULA A INNER JOIN PROGRAMACION_ACADEMICA B ");
				query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID INNER JOIN CURSO C ON C.COD_CURSO=B.COD_CURSO ");
				query.append(" INNER JOIN PERIODO_ACADEMICO D ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID ");
				query.append(" INNER JOIN CURRICULA E ON E.CURRICULA_ID=B.CURRICULA_ID INNER JOIN ALUMNO F ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
				query.append(" WHERE D.ESTADO_ID=1 AND B.COD_CURSO='"+codCurso+"'");
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT D.NOMBRE AS PERIDO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, C.NOMBRE AS CURSO,");
			query.append(" A.CODIGO_ALUMNO,NOMBRE_COMPLETO FROM MATRICULA A INNER JOIN PROGRAMACION_ACADEMICA B ");
			query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID INNER JOIN CURSO C ON C.COD_CURSO=B.COD_CURSO ");
			query.append(" INNER JOIN PERIODO_ACADEMICO D ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID ");
			query.append(" INNER JOIN CURRICULA E ON E.CURRICULA_ID=B.CURRICULA_ID INNER JOIN ALUMNO F ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
			query.append(" WHERE D.ESTADO_ID=1 AND B.COD_CURSO='"+codCurso+"'");
		}
		System.out.println("[ProgramacionAcademicaBO][estableceQueryAlumnosxCurso] query:"+query.toString());
		return query;
	}
}
